#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

typedef void (*handler_t)();

std::vector<handler_t> handlers;

void func1()
{
    printf("hello, 我是方法1\n");
}

void func2()
{
    printf("hello, 我是方法2\n");
}

void func3()
{
    printf("hello, 我是方法3\n");
}

void Load()
{
    //加载方法 -- 如果让父进程做更多的事情，把更多的方法加载进去就可以了
    handlers.push_back(func1);
    handlers.push_back(func2);
    handlers.push_back(func3);
}

//C++方法集
int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        //子进程 
        //死循环跑不完，但是代码出现异常了，进程收到信号，信号终止了子进程，父进程就要知道
        while(1)
        {
            printf("我是子进程，我的PID : %d, 我的PPID : %d\n", getpid(), getppid());

            sleep(3);
        }

        exit(111);
    }
    else if(id > 0)
    {
        //父进程
        //基于非阻塞的轮询等待方案
        
        int status = 0;
        while(1)
        {
            pid_t ret = waitpid(-1, &status, WNOHANG);
            if(ret > 0)
            {   
                printf("等待成功, %d, exit sig: %d, exit code: %d\n", ret, status & 0x007F, (status & 0xFF00) >> 8);
                break;
            }
            else if(ret == 0)
            {           
                //等待成功了，但是子进程没有退出 -- 函数调用成功了，只不过是在非阻塞状态
                printf("子进程好了没，还没，那么父进程就做其他事情...\n");

                if(handlers.empty()) Load();
                for(auto f : handlers)
                {
                    f(); //回调处理对应的任务 
                }

                sleep(1);
            }
            else 
            {
                //出错了，暂时不处理
            }
        }
    }
    else 
    {
        //do nothing         
    }
    
    return 0;
}
